//
//  XPBaseTableViewController.swift
//  PPKit
//
//  Created by xiaopin on 16/8/31.
//  Copyright © 2016年 pinguo. All rights reserved.
//  https://gitee.com/xiaopindev/PPKit
//  https://github.com/xiaopindev
//  https://xiaopin.cnblogs.com

import UIKit
import MJRefresh

/// 重用标志，如果使用sb和xib的cell，也设置相同如下的值:"reuseCell"
//let kTableCellIdentifier = "ReuseTableCell"


class XPBaseTableView: UITableView {
    
    var layoutSubviewsCallback:(() -> Void)?
    
    override init(frame: CGRect, style: UITableView.Style) {
        super.init(frame: frame, style: style)
        if #available(iOS 15, *) {
            sectionHeaderTopPadding = 0
        }
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        layoutSubviewsCallback?()
    }
}


class XPBaseTableViewController: XPBaseViewController {

    //MARK: 属性
    //分页属性
    var pageIndex:Int = 1
    var pageSize:Int = 20
    var maxIndex:Int = 0
    
    //cell动画
    var animationType:Int = 0
    var lastCellIndex:Int = 0
    /// 滚动条上次记录的Offset
    var prevOffset:CGPoint = CGPoint(x: 0, y: 0)
    /// 表格数据源
    var dataSource = [AnyObject]()
    /// cell高度缓存
    var heightMap = [Int: CGFloat]()
    /// 是否可以滚动
    var canScroll:Bool = true
    var isScrolling:Bool = false
    
    lazy var tbStyle:UITableView.Style = tableViewStyle()
    
    lazy var tableView:XPBaseTableView = {
        let tbView = XPBaseTableView(frame: CGRect(x: 0, y: 0, width: pp_screen_width, height: pp_screen_height), style: tbStyle)
        tbView.backgroundColor = .clear
        tbView.separatorStyle = .none
        tbView.showsVerticalScrollIndicator = true
        tbView.showsHorizontalScrollIndicator = false
        tbView.contentInsetAdjustmentBehavior = .never
        tbView.rowHeight = UITableView.automaticDimension
        if #available(iOS 15.0, *) {
            tbView.sectionHeaderTopPadding = 0
        }
        /*
         视图漂移或者闪动原因：
         因为iOS 11后系统默认开启Self-Sizing，首先要知道Self-Sizing是个什么东东。官方文档是这样解释的：大概就是说我们不用再自己去计算cell的高度了，只要设置好这两个属性，约束好布局，系统会自动计算好cell的高度。
         IOS11以后，Self-Sizing默认开启，包括Headers, footers。如果项目中没使用estimatedRowHeight属性，在IOS11下会有奇奇怪怪的现象，因为IOS11之前，estimatedRowHeight默认为0，Self-Sizing自动打开后，contentSize和contentOffset都可能发生改变。
         
         解决reloadData和reloadRows闪动问题:
         */
        tbView.estimatedRowHeight = 0
        tbView.estimatedSectionHeaderHeight = 0
        tbView.estimatedSectionFooterHeight = 0
        
        let header = UIView(frame: .zero)
        header.backgroundColor = .clear
        tbView.tableHeaderView = header
        
        let footer = UIView(frame: .zero)
        footer.backgroundColor = .clear
        tbView.tableFooterView = footer
        
        return tbView
    }()
    
    
    //MARK: 系统基类方法
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.view.addSubview(self.tableView)
    }
    
    /// 重写tableview的style
    func tableViewStyle() -> UITableView.Style {
        return .plain
    }
}

// MARK: - 自定义方法
extension XPBaseTableViewController{
    /// 下拉加载新数据
    ///
    /// 如果列表需要增加下拉刷新操作，在initSubviews()方法中调用 addPullDownAction(), 此时下拉刷新后会触发此方法，在这个方法中进行数据请求后，刷新界面数据
    func loadNewData() {
        
    }
    
    /// 上拉加载更多数据
    ///
    /// 如果列表需要增加上拉加载更多操作，在initSubviews()方法中调用 addPullUpAction(), 此时滚动到底部以后后会触发此方法，在这个方法中进行数据请求后，刷新界面数据
    func loadMoreData() {
        
    }
    
    /**
     下拉刷新
     
     如果需要下拉刷新操作，在initSubviews()方法中调用 addPullDownAction(),
     */
    func addPullDownAction() {
        let header = MJRefreshGifHeader(refreshingTarget: self, refreshingAction: #selector(loadNewData))
        let refreshImages:[UIImage] = [
            UIImage(named: "animation_loading_1_small")!,
            UIImage(named: "animation_loading_2_small")!,
            UIImage(named: "animation_loading_3_small")!,
            UIImage(named: "animation_loading_4_small")!,
            UIImage(named: "animation_loading_5_small")!,
            UIImage(named: "animation_loading_6_small")!,
            UIImage(named: "animation_loading_7_small")!,
            UIImage(named: "animation_loading_8_small")!
        ]
        header.setImages(refreshImages, for: .idle)
        header.setImages(refreshImages, for: .pulling)
        header.setImages(refreshImages, for: .refreshing)
        header.setTitle("MT_Refresh_Idle".localized, for: .idle)
        header.setTitle("MT_Refresh_Pulling".localized, for: .pulling)
        header.setTitle("MT_Refresh_Refreshing".localized, for: .refreshing)
        header.lastUpdatedTimeLabel?.isHidden = true
        header.stateLabel?.isHidden = true
    
        self.tableView.mj_header = header
    }
    
    /**
     上拉加载更多
     
     如果需要加载更多操作，在initSubviews()方法中调用 addPullUpAction(),
     */
    func addPullUpAction(){
        let footer = XPAutoFooter(refreshingTarget: self, refreshingAction: #selector(loadMoreData))
        self.tableView.mj_footer = footer;
    }
    
    /// 结束刷新
    ///
    /// 此操作可以结束表格的上拉、下拉的刷新状态、logo加载效果的状态
    func endRefreshing() {
        DispatchQueue.main.async {
            if self.tableView.mj_header?.isRefreshing == true {
                self.tableView.mj_header?.endRefreshing()
                self.tableView.mj_footer?.resetNoMoreData()
            }
            if self.tableView.mj_footer?.isRefreshing == true {
                self.tableView.mj_footer?.endRefreshing()
            }
            self.hideLoading2()
        }
    }
}

/*
extension XPBaseTableViewController:UITableViewDelegate,UITableViewDataSource{
    
    //表格有多少组
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    
    //每组多少行
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 0
    }
    
    //高度
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 0
    }
    
    //单元格加载
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifiler)
        return cell!
    }
    
    //选中
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        
    }
}
*/

